"""
    反射的原理：基于面向对象的基础，通过使用字符串对象对应对象中具体的某个属性或者方法
    可以对实例对象属性的方法和变量进行调用或者修改
"""
class A:
    class_param = 100

    def __init__(self):
        self.param = 10

    def a(self):
        print("我是a实例方法")

    def b(self):
        print("我是b实例方法")

    def c(self):
        print("我是b实例方法")


def func():
    print("调用func函数")


a = A()
"""
    反射添加或覆盖
"""
# 给对象添加一个实例方法：前提必须要有该函数或者方法的引用
setattr(a, "m", input)
print(a.m("输入一个数:"))
setattr(a, "func", func)
a.func()
# 如果设置的方法名和原有的方法名相同，则之前的会被覆盖
setattr(a, "a", print)
a.a("这是新的a方法")

"""
    反射删除实例属性 无法删除类属性、类方法，实例方法
"""
delattr(a, "param")

"""
    反射查询具体方法 查询对象是否具有该类属性、类方法，实例变量、实例方法
"""
print(hasattr(a, "param"))

"""
    反射读取使用方法 就是将方法的引用进行传递
"""
f = getattr(a, "b")
f()
